<?php
/**
 * @brief Klasa mapująca dane z bazy danych na obiekty klasy encyjnej Application_Model_MarketEntity
 *
 * Obiekty tej klasy pośredniczą wymianie danych między bazą danych a obiektami klasy Application_Model_MarketEntityMapper.
 * Za pomocą metod z przypisanej klasy tabeli tworzą obiekty na podstawie danych z bazy danych 
 * oraz zapisują informacje z obiektów do bazy danych.
 */
class Application_Model_MarketEntityMapper
{
    protected $_dbTable; /*!<  Obiekt klasy tabeli */

    /**
     * @brief Metoda do ustawiania nazwy powiązanej klasy tabel o podanej nazwie.
     * 
     * @param string $dbTable
     * @return Application_Model_MarketEntityMapper 
     */
    public function setDbTable($dbTable) {

        if (is_string($dbTable)) {

            $dbTable = new $dbTable();
        }

        if (!$dbTable instanceof Zend_Db_Table_Abstract) {

            throw new Exception('Invalid table data gateway provided');
        }

        $this->_dbTable = $dbTable;

        return $this;
    }
    
    /**
     * @brief Metoda zwracająca obiekt powiązanej klasy tabel.
     * 
     * @return Application_Model_DbTable_MarketEntity
     */
    public function getDbTable() {

        if (null === $this->_dbTable) {

            $this->setDbTable('Application_Model_DbTable_MarketEntity'); 
        }

        return $this->_dbTable;
    }

    /**
     * @brief Metoda zapisująca informacje do bazy danych  z obiektu reprezentującego 
     *
     * Metoda służy zarówno do tworzenia w bazie danych nowych rekordów, jak i aktualizacji starych. 
     * Aktualizacja następuje w przypadku, gdy zostanie wybrana taka opcja.
     * 
     * @param Application_Model_MarketEntity $entity
     * @param bool $update 
     */
    public function save(Application_Model_MarketEntity $entity, $update = FALSE) { 

        $address = $entity->getAddress();
        
        $data = array(

            'password'      =>$entity->getPassword(),
            'email'         =>$entity->getEmail(),
            'salt'          =>$entity->getSalt(),
            'login'         =>$entity->getLogin(),
            'name'          =>$entity->getName(),
            'name2'         =>$entity->getName2(),
            'surname'       =>$entity->getSurname(),
            'role'          =>$entity->getRole(),
            'postcode'      =>$address['postcode'],
            'city'          =>$address['city'],
            'number'        =>$address['number'],
            'flat'          =>$address['flat'],
            'street'        =>$address['street'],
        );



        if ($update == FALSE) { 

        $this->getDbTable()->insert($data);
        
        
        } else {

            $this->getDbTable()->update($data, array('login = ?' => $entity->getLogin())); 
        }
    }

    /**
     * @brief Metoda wyszukująca jednostkę rynkową na podstawie loginu.
     *
     * Metoda generuje pojedynczy obiekt reprezentujący jednsotkę rynkową na podstawie rekordu, o podanym
     * loginie, znalezionego w bazie danych.
     * 
     * @param string $id
     * @return Application_Model_MarketEntity | null
     */
    public function find($id) { 
	$entity = new Application_Model_MarketEntity();   
        $result = $this->getDbTable()->find($id);

        if (0 == count($result)) {

            return;
        }

        $row = $result->current();


        $entity->setPassword($row->password);
        $entity->setEmail($row->email);
        $entity->setSalt($row->salt);
        $entity->setLogin($row->login);
        $entity->setName($row->name);
        $entity->setName2($row->name2);
        $entity->setSurname($row->surname);
        $entity->setRole($row->role);

        
        $address = array(
                   'street'  => $row->street,
                   'number'  => $row->number,
                   'flat'    => $row->flat,          
                   'city'    => $row->city,
                   'postcode'=> $row->postcode,
        );
            
        $entity->setAddress($address);
        
        
        
        return $entity;

    }
	
    /**
     * @brief Metoda wyszukująca zbiór jednsotek rynkowych na podstawie danych wejściowych.
     *
     * Metoda wyszukuje zbiór jednsotek rynkowych i zwraca tablicę obiektów Application_Model_MarketEntity.
     * Zbiór rekordów uzyskanych z klasy tabel jest przetwarzany przez inną metodę.
     * 
     * @param string $query
     * @return array Application_Model_MarketEntity 
     */
    public function fetchAll($query = NULL) {
        if ($query === NULL) {
            $resultSet = $this->getDbTable()->fetchAll();
            
        } else {
            $table = $this->getDbTable();
            $select = $table->select();
            $select->from($table)
                    ->where($query)
                    ->order('login');

            $resultSet = $this->getDbTable()->fetchAll($select);
        }
        return $this->processResultSet($resultSet);
    }

    /**
     * @brief Metoda przetwarza rekordy na obiekty.
     * 
     * @param Zend_Db_Table_Rowset $resultSet
     * @return string Application_Model_MarketEntity 
     */
    private function processResultSet($resultSet) {
        $entries = array();
        foreach ($resultSet as $row) {

            $entity = new Application_Model_MarketEntity();

            $entity->setPassword($row->password);
            $entity->setEmail($row->email);
            $entity->setSalt($row->salt);
            $entity->setLogin($row->login);
            $entity->setName($row->name);
            $entity->setName2($row->name2);
            $entity->setSurname($row->surname);
            $entity->setRole($row->role);

            
            $address = array(
                        'street'  => $row->street,
                        'number'  => $row->number,
                        'flat'    => $row->flat,          
                        'city'    => $row->city,
                        'postcode'=> $row->postcode,
            );
            
            $entity->setAddress($address);
            

            $entries[] = $entity;
        }
        return $entries;
    }

}

